package georeduy.dao;

import java.util.List;

import georeduy.clases.Empresa;
import georeduy.clases.Local;
import georeduy.clases.Oferta;
import georeduy.dao.interfaces.IEmpresaDAO;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

@Stateless(name = "EmpresaDAO", mappedName = "GeoRed.uy-GeoRed.uy-JPA-EmpresaDAO")
public class EmpresaDAO
        implements  IEmpresaDAO
{

    @PersistenceContext(unitName="Geored.uy-JPA")
    private EntityManager em;

    public EmpresaDAO() { }

    public Object queryByRange(String jpqlStmt, int firstResult,
                               int maxResults) {
        Query query = em.createQuery(jpqlStmt);
        if (firstResult > 0) {
            query = query.setFirstResult(firstResult);
        }
        if (maxResults > 0) {
            query = query.setMaxResults(maxResults);
        }
        return query.getResultList();
    }

    public Empresa persistEmpresa(Empresa empresa) {
        empresa.setPrimeraVez(true);
    	em.persist(empresa);
        return empresa; }
    public Empresa mergeEmpresa(Empresa empresa) {
        return em.merge(empresa); }

    @SuppressWarnings("unchecked")
	public void removeEmpresa(String empresa)
    {
    	Empresa e = em.find(Empresa.class, empresa);
    	Query q = em.createQuery("SELECT l FROM Local l WHERE l.empresa = :empresa");
    	q.setParameter("empresa", e);
    	List<Local> ll = q.getResultList();
    	for(Local l : ll)
    	{
    		q = em.createQuery("SELECT o FROM Oferta o WHERE local = :local");
    		q.setParameter("local", l);
    		List<Oferta> oo = q.getResultList();
    		for(Oferta o : oo)
    		{
    			em.remove(o);
    		}
    		em.remove(l);
    	}
        
        em.remove(e); 
    }

	@Override
	public boolean LoginEmpresa(String usuario, String password) {
		{
			//String LOGIN_EMPRESA = "select u from Empresa u where upper(u.usuario) = :usuario  and upper(u.password) = :password";
			String LOGIN_EMPRESA = "select u from Empresa u where u.mail = :usuario  and u.password = :password";
			Query query = em.createQuery(LOGIN_EMPRESA);
			query.setParameter("usuario", usuario);
			query.setParameter("password", password);
			return ((query.getResultList() != null) && (query.getResultList().size() > 0));
		}
	}

	@Override
	public  Empresa FindEmpresaxNombre(String nombre) {		
		Empresa e = em.find(Empresa.class, nombre);		
		return e;
	}
	
	@Override
	public  Empresa FindEmpresaxMail(String mail)
	{
		Empresa e;
		Query query = em.createQuery("SELECT e FROM Empresa e WHERE e.mail = :mail");
		query.setParameter("mail", mail);
		try
		{
			e = (Empresa) query.getSingleResult();
		}
		catch(NoResultException ex)
		{
			return null;
		}
		return e;
	}
	

	@SuppressWarnings("unchecked")
	@Override
	public List<Empresa> listarEmpresas() {
		 Query query = em.createQuery("select e from Empresa e");
		 List<Empresa> ee = query.getResultList();
		 return ee;
	}

}
